#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDateTime>
#include <QTimer>
#include <QLabel>
#include <QSerialPort>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE

namespace Ui {
class MainWindow;
}
class QIntValidator;

QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    struct Settings
    {
        QString name;
        qint32 baudRate;
        QString stringBaudRate;
        QSerialPort::DataBits dataBits;
        QString stringDataBits;
        QSerialPort::Parity parity;
        QString stringParity;
        QSerialPort::StopBits stopBits;
        QString stringStopBits;
        QSerialPort::FlowControl flowControl;
        QString stringFlowControl;
        bool localEchoEnabled;
    };
    Settings settings() const;

private slots:
    void _time_update(); // 时间更新槽函数，用于状态栏显示时间
    void showPortInfo(int idx);
    void apply();
    void checkCustomBaudRatePolicy(int idx);
    void checkCustomDevicePathPolicy(int idx);
    void openSerialPort(); // 打开串口
    void closeSerialPort(); // 关闭串口
    void writeData(const QByteArray &data); // 向串口写数据
    void readData(); // 从串口读取数据
    void handleError(QSerialPort::SerialPortError error); // 错误处理
    void handleTimeout(); // 处理超时
    void sendTest();
    void readTest();
    void timerTest();

private:
    void layoutInit(); // 布局初始化
    void scanSerialPort(); // 扫描系统可用串口
    void baudRateItemInit(); // 波特率项初始化
    void dataBitsItemInit(); // 数据位项初始化
    void parityItemInit(); // 校验位项初始化
    void stopBitsItemInit(); // 停止位项初始化

    void fillPortParameters();
    void fillPortsInfo();
    void updateSettings();

    void showStatusMessage(const QString &message); // 在状态栏显示信息

private:
    Ui::MainWindow *ui;
    QLabel *currentTimeLabel; // 用于显示当前时间
    QLabel *status_; // 用于显示当前显示状态
    Settings currentSettings_;
    QIntValidator *intValidator_ = nullptr;
    QTimer *timer_;
    QSerialPort *serial_ = nullptr;
};
#endif // MAINWINDOW_H
